home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Enigma Amiga CD / Docs&Guide / CorsoGuide / Interrupt-11.txt < prev    next >
Text File  |  1992-09-02  |  3KB  |  65 lines

  1. Interrupt
  2.  
  3. L'interrupt (in italiano interruzione) è un segnale che viene inviato
  4. dall'hardware (quasi sempre adibito a mansioni di I/O) al microprocessore
  5. che interrompe per questo il normale corso di elaborazione del programma per
  6. andare ad eseguire una particolare routine (detta interrupt server o
  7. servitore dell'interruzione) che risolverà la particolare situazione del
  8. sistema; ad esempio un classico caso di interrupt è la tastiera: appena
  9. l'utente preme un tasto, l'interfaccia della tastiera invia un interrupt al
  10. microprocessore, il quale esegue la routine di interruzione che preleva il
  11. codice del tasto premuto; in questa maniera si evita che il microprocessore
  12. verfichi sempre se un tasto è premuto (polling) risparmiando così, un
  13. notevole numero di cicli macchina; potete osservare la lista delle diverse
  14. interruzioni nella tabella apposita.
  15. Accanto a questo tipo di interrupt denominati hardware vi sono i software
  16. interrupts, cioè interrupt provocati dal software (dal task quindi); voi
  17. direte: a questo punto conviene creare un subroutine da chiamare quando
  18. serve e si ottiene lo stesso risultato! Invece non è proprio la stessa cosa,
  19. poiché le interrupt software hanno una priorità più alta dei task (e più
  20. bassa delle interrupt hardware) quindi eseguendo un interrupt software il
  21. multitasking è momentaneamente disattivato.
  22. La struttura che definisce un'interrupt sia software che hardware è la
  23. seguente:
  24.  
  25. struct Interrupt
  26. {
  27.   struct Node is_Node;
  28.   APTR id_Data;
  29.   VOID (*is_Code)();
  30. };
  31.  
  32. dove is_Node indica che l'interrupt è mantenuta in una lista del s.o. e
  33. devono essere definite le sue caratteristiche, priorità, nome e tipo
  34. (NT_INTERRUPT); is_Data è un puntatore ad un buffer dati gestito dal
  35. programmatore per passare all'interrupt, dati che possono essere utili;
  36. is_Code è il puntatore alla routine di interrupt.
  37. Le funzioni di exec che servono per l'installazione di interrupt sono:
  38.  
  39. vecchiaint = (struct Interrupt *)SetIntVector(tipoint,nuovaint);
  40.  
  41. dove "tipoint" è una costante definita in <hardware/intbits.h> che indica a
  42. quale interrupt hardware installare il server identificato dal puntatore
  43. alla struttura Interrupt "nuovaint"; "vecchiaint" è il puntatore alla
  44. struttura Interrupt del server che viene rimpiazzato; questa funzione
  45. esclude il codice di interrupt esistente, e questo potrebbe causare qualche
  46. problema al sistema a cui potrebbe servire l'interrupt, quindi va usata con
  47. cautela.
  48.  
  49. AddIntServer(tipoint,nuovaint);
  50.  
  51. Questa funzione invece aggiunge l'interrupt a quelle già esistenti;
  52. praticamente quando si verifica l'interrupt di tipo "tipoint" il sistema
  53. scandirà una lista (ordinata per priorità) con i diversi interrupt servers e
  54. li eseguirà tutti; questo metodo quindi non mette in pericolo il perfetto
  55. funzionamento del sistema; per eliminare l'interrupt dalla lista dei servers
  56. occorre chiamare RemIntServer con gli stessi parametri della AddIntServer.
  57. La funzione per chiamare un'interrupt software è questa:
  58.  
  59. Cause(inter);
  60.  
  61. dove "inter" è il puntatore ad una struttura Interrupt. In realtà come
  62. abbiamo visto la puntata scorsa l'interrupt software può essere chiamata da
  63. una porta appena giunge un messaggio ponendo in mp_Flags PA_SOFTINT e in
  64. mp_SigTask il puntatore alla struttura Interrupt relativa.
  65.